package com.qf.index;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import org.jsoup.Jsoup;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;

public class transTi {

    /**
     * 翻译中英文标题，这个程序不能应用到生产中，仅是一次性的对全表进行翻译，并把翻译的结果保存到titleTransTable，供生产使用，生产使用的方法在WebSite。
     * 贾新志 2025.03.21
     */

    public static void main(String[] args) throws SQLException {

        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(format.format(new Date()) + " 程序开始了~~~");

        String newDataName = "scholar_25_02.";
        String titleTransTable = newDataName + "basic_title_trans";
        String summaryFinalTable = newDataName + "unified_search_summary_0315_title";

        int onePageNum = 1000;
        String limit = "";
//        String limit = " limit 1";

        // 本方法可以使用d1、d2、d3、d4，分成4段，反复跑。
        transTitle(summaryFinalTable, "id", "year`,`pmId`,`ut`,`title`,`cn_ti", 0, 100, titleTransTable);

    }

    public static void transTitle(String summaryTitleTable, String autoId, String field, int min, int max, String titleTransTable) throws SQLException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int onePageNum = 10000;
        int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + summaryTitleTable).intValue();
        if (tableMax > 0) {
            Collection<Integer> tableList = new ArrayList<>();
            NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
            for (Integer startId : tableList) {
                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + summaryTitleTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1));
                System.out.println("\033[31;1m" + format.format(new Date()) + " 标题翻译：" + startId + " 表名：" + summaryTitleTable + Utils.printMemoryStr() + "\033[0m");
                for (Entity entry : tableData) {
                    int id = Utils.getIntField(entry, autoId);
                    int end = id > 10 ? Integer.parseInt(Integer.toString(id).substring(Integer.toString(id).length() - 2)) : id;
                    int pmId = Utils.getIntField(entry, "pmId");
                    String ut = Utils.getStrField(entry, "ut");
                    if (end >= min && end <= max) {
                        String title = Utils.getStrField(entry, "title");
                        String cnTi = Utils.getStrField(entry, "cn_ti");
                        if (title.length() < 4 && cnTi.length() > 1) {
                            boolean isCn = Utils.isContainChinese(cnTi);
                            if (isCn) {
                                // 从中到英
                                String trans = "ĺļ" + TransApi.youDaoCnToEnTrans(cnTi);
                                updateInsertTable(summaryTitleTable, ut, pmId, autoId, "title", 1, id, cnTi, trans, titleTransTable, "");
                            } else {
                                // 这种情况是中文标题内的不是中文，而是英文，而英文中的又没有，也就是说放反了。
                                String trans = "ĺļ" + TransApi.youDaoEnToCnTrans(cnTi);
                                updateInsertTable(summaryTitleTable, ut, pmId, autoId, "title", 2, id, cnTi, trans, titleTransTable, "");
                            }
                        }
                        if ((pmId > 0 || ut.length() >= 15) && title.length() > 3 && cnTi.length() < 4) {
                            // 从英到中分两种，一种是ut或pm的，一种是知网或其它的，这里的是处理ut或pm的。
                            String trans = "";
                            String ti = title.trim();
                            ti = ti.startsWith("[") && ti.endsWith("].") ? ti.substring("[".length(), ti.length() - "].".length()).trim() : ti;
                            ti = ti.startsWith("[") && ti.endsWith("]") ? ti.substring("[".length(), ti.length() - "]".length()).trim() : ti;
                            ti = Pattern.compile("<[^>]*>").matcher(ti).find() ? Jsoup.parse(ti).text().trim() : ti;
                            String f = ti.startsWith("被撤回的出版物:") || ti.startsWith("RETRACTED:") ? "被撤回的出版物: " : "";
                            f = ti.startsWith("撤稿声明:") ? "撤稿声明: " : f;
                            ti = ti.startsWith("被撤回的出版物:") ? ti.substring("被撤回的出版物:".length()).trim() : ti;
                            ti = ti.startsWith("撤稿声明:") ? ti.substring("撤稿声明:".length()).trim() : ti;
                            ti = ti.startsWith("RETRACTED:") ? ti.substring("RETRACTED:".length()).trim() : ti;
                            trans = "ĺļ" + f + TransApi.youDaoEnToCnTrans(ti);
                            updateInsertTable(summaryTitleTable, ut, pmId, autoId, "cn_ti", 0, id, title, trans, titleTransTable, ti);
                        }
                        if (pmId < 1 && ut.length() < 15 && title.length() > 3 && cnTi.length() < 2) {
                            boolean isEn = !Utils.isContainChinese(title);
                            if (isEn) {
                                String trans = "ĺļ" + TransApi.youDaoEnToCnTrans(title);
                                updateInsertTable(summaryTitleTable, ut, pmId, autoId, "cn_ti", 3, id, title, trans, titleTransTable, "");
                            } else {
                                String trans = "ĺļ" + TransApi.youDaoCnToEnTrans(title);
                                updateInsertTable(summaryTitleTable, ut, pmId, autoId, "cn_ti", 4, id, title, trans, titleTransTable, "");
                            }
                        }
                    }
                }
            }
        }
    }

    public static void updateInsertTable(String summaryTitleTable, String ut, int pmId, String autoId, String field, int type, int id, String original, String trans, String titleTransTable, String ti) {
        if (trans.length() > 3) {
            try {
                Db.use().update(Entity.create().set(field, trans), Entity.create(summaryTitleTable).set(autoId, id));
                Db.use().insert(Entity.create(titleTransTable).set("ut", ut).set("pm", pmId).set("type", type).set("original", original).set("trans", trans).set("ti", ti));
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }


}
